package ObjectOriented;

/**
 * 接口: 如果一个抽象类没有字段，所有方法全部都是抽象方法,就可以把该抽象类改写为接口
   注意： 
      1、接口不能有字段
      2、接口的所有方法默认都是public abstract
      3、一个具体的类实现多个接口，可以使用implements关键字
      4、接口中可以定义default方法，default方法可以有方法体; 实现类可以不必覆写default方法
   接口继承：接口可以继承多个接口，使用extends关键字

   接口和抽象类的对比
    1、 继承： 抽象类只能单继承，接口可以多继承
    2、 字段： 抽象类可以有字段，接口没有字段
    3、 抽象方法： 抽象类可以有方法，接口只能有抽象方法
    4、 非抽象方法： 抽象类可以定义非抽象方法，接口可以有default方法
 */
interface Person {
  default void run() {
    System.out.println("Person.run");
  }
  String getName();
}

interface Action extends Person {
  void eat();
}

class Student implements Action {
  private String name;

  public Student (String name) {
    this.name = name;
  }

  // @Override
  // public void run() {
  //   System.out.println( this.name +" Student.run");
  // }

  @Override
  public String getName() {
    return this.name;
  }
  @Override
  public void eat() {
    System.out.println( this.name +" Student.eat");
  }
}


public class Interface {
  public static void main(String[] args) {
    Student s = new Student("Alice");
    s.run();
    s.eat();
  }
  
}
